/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package graf;

import java.util.ArrayList;

/**
 *
 * @author sufka
 */
public class ParKrawedzioweAlgorytm implements Pokrycie {

    Graf graf;
    KrawedzioweAlgorytm kAlg;

    public ParKrawedzioweAlgorytm(Graf graf) {
        this.graf = graf;
        kAlg = new KrawedzioweAlgorytm(graf);
    }

    public ArrayList<Sciezka> tworzPokrycie() {

        ArrayList<Sciezka> zbiorKrawedzi = kAlg.tworzPokrycie();
        ArrayList<Sciezka> zbiorParKrawedzi = new ArrayList<Sciezka>();
        ArrayList<Boolean> zajetosciKrwedzi = new ArrayList<Boolean>();
        for (int i = 0; i < zbiorKrawedzi.size(); ++i) {
            zajetosciKrwedzi.add(false);
        }

        //tworze pary krawedzi osiagalne w grafie
        for (int i = 0; i < zbiorKrawedzi.size() - 1; ++i) {
            Sciezka s = zbiorKrawedzi.get(i), s2;
            if (s.pierwszy().getNumer() == -1) {
                break;
            }
            for (int j = 0; j < zbiorKrawedzi.size() - 1; j++) {
                s2 = zbiorKrawedzi.get(j);
                if (s2.pierwszy().getNumer() != -1) {
                    if (s2.pierwszy() == s.ostatni()) {
                        Sciezka sTemp = new Sciezka();
                        zajetosciKrwedzi.set(zbiorKrawedzi.indexOf(s), true);
                        zajetosciKrwedzi.set(zbiorKrawedzi.indexOf(s2), true);
                        sTemp.dodajNaKoniec(s.pierwszy());
                        sTemp.dodajNaKoniec(s2.pierwszy());
                        sTemp.dodajNaKoniec(s2.ostatni());
                        zbiorParKrawedzi.add(sTemp);
                    }
                }
            }
        }

        //jesli nie wykorzystalem wszystkich krawedzi, ktore byly wymagane (osiagalne)
        for(int i = 0; i < zajetosciKrwedzi.size()-1; ++i){
            if(zbiorKrawedzi.get(i).pierwszy().getNumer() == -1){
                break;
            }
            if(!zajetosciKrwedzi.get(i)){
                zbiorParKrawedzi.add(zbiorKrawedzi.get(i));
            }
        }

        graf.odswiezWierzcholki();
        return zbiorParKrawedzi;
    }

}
